//--------------------------------------------------
// タスク追加ダイアログ
//--------------------------------------------------

App.TaskDlgIndex = function(config){
	// スーパークラスコンストラクタ呼び出し
	App.TaskDlgIndex.superclass.constructor.call(this, config);
} ;

// App.ModalDialogを継承
Ext.extend(App.TaskDlgIndex, App.ModalDialog, {
    //=============================
    // メンバー
    //=============================
    // オーバーライドメンバー
    width          :450,                   // ダイアログ幅
    height         :470,                   // ダイアログ高さ
    container      :"dlg_tsk_edit",    // コンテナエレメントのID
    auto_loading   :true,

    // 独自メンバー
    newurl         : url_for("/task/dlg_new"),      // データ読込URL
    editurl        : url_for("/task/dlg_edit"),     // データ読込URL
    createurl      : url_for("/task/dlg_create"),   // 新規作成URL
    updateurl      : url_for("/task/dlg_update"),   // 更新URL
    destroyurl      : url_for("/task/dlg_destroy"), // 削除URL
    responseobj    : null,
    projectusers   : null,
    resulthtml     : null,
    
    msg_save_confirm    : app_localized_message("confirm", "save_confirm"),
    msg_destroy_confirm : app_localized_message("confirm", "destroy_confirm"),
    elmid_id       : "dlg_tsk_edit_task_id",
    frmid          : "dlg_tsk_edit_form",
    
    elmid_btn_save      : "dlg_tsk_edit_save",
    elmid_btn_destroy   : "dlg_tsk_edit_destroy",
    elmid_btn_close     : "dlg_tsk_edit_close",
    elmid_btn_tusel     : "dlg_tsk_edit_tuselect",
    
    datparam : null,
    
    /*
     * 関数名：onDocLoaded
     * 概　要：ドキュメント読込完了イベント。
     *         該当ダイアログ内のエレメントに対し、イベント設定を行う
     * 引　数：なし
     * 戻り値：なし
     */
    onDocLoaded : function(){
        // 保存ボタンクリックイベント設定
        elm = Ext.get(this.elmid_btn_save) ;
        elm.on('click', this.onSave, this, true) ;
        // 削除ボタンクリックイベント設定
        elm = Ext.get(this.elmid_btn_destroy) ;
        elm.on('click', this.onDestroy, this, true) ;
        // 閉じるボタンクリックイベント設定
        elm = Ext.get(this.elmid_btn_close) ;
        elm.on('click', this.onClose, this, true) ;
        //担当選択ボタンクリックイベント設定
        elm = Ext.get(this.elmid_btn_tusel) ;
        elm.on('click', this.onTaskUserSelect, this, true) ;
        // 期限フィールドイベント設定
        elm = Ext.get('dlg_tsk_edit_task_complete_date') ;
        elm.on('change', this.onCompleteDateChanged, this, true) ;
    },
    
    /*
     * 関数名：onSave
     * 概　要：保存ボタンクリックイベント。
     *         フォームの内容をAjax経由で登録要求する。
     * 引　数：なし
     * 戻り値：なし
     */
    onSave : function(){
        // 入力チェック
        if( !this.fncInputCheck() ) return false ;

        // 確認メッセージ表示
        var ret = confirm( this.msg_save_confirm ) ;
        if( !ret ) return false ;
            
        try{
						
            Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'hidden' ;
            Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'hidden' ;
            Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'hidden' ;

            var url = "";
						
            if( Ext.get(this.elmid_id).dom.value == "" ){
              // 新規作成処理要求
              url = this.createurl ;
							Ext.get('dlg_tsk_edit_base_id').dom.value = ""; //2008/07/16 add kawazoe ガントでタスクを追加できるように
            }
            else{
              // 更新要求
              url = this.updateurl ;
            }

            // エレメントを生成
            this.fncFormSetProjectUsers() ;
            
            // 非同期リクエスト
			var options =
			{
				url: url,
				form: this.frmid,
				success: this.onSaveSuccess ,
				failure: this.onSaveFail,
				scope: this,
				method :'POST'
			} ;
			Ext.Ajax.request(options) ;

        } catch(e) {
            alert(e.message);
        }
    
        return false ;
    },

    /*
     * 関数名：onSaveSuccess
     * 概　要：保存処理成功イベント。
     *         処理成功時の後処理を行う。
     * 引　数：obj      Object      サーバーレスポンスオブジェクト
     * 戻り値：なし
     */
    onSaveSuccess : function(obj){
        var responseobj = Ext.util.JSON.decode(obj.responseText) ;

        var success = responseobj.success ;
        var message = responseobj.message ;
        if( success ){
            this.responseobj = responseobj ;
            var resultobj = responseobj.result ;
            this.resulthtml = resultobj.resulthtml ;
        
            this.dialog.hide();
            // コールバック関数呼び出し
            this.fncExecCallback("on_save");
        }
        else{
            alert(message) ;
        }
        Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'visible' ;
    },
    
    /*
     * 関数名：onSaveFail
     * 概　要：保存処理失敗イベント。
     *         処理失敗時の後処理を行う。
     * 引　数：obj      Object      サーバーレスポンスオブジェクト
     * 戻り値：なし
     */
    onSaveFail : function(obj){
        alert(obj.responseText) ;
    },
    
    
    /*
     * 関数名：onDestroy
     * 概　要：削除ボタンクリックイベント。
     *         フォームの内容をAjax経由で削除要求する。
     * 引　数：なし
     * 戻り値：なし
     */
    onDestroy : function(){

        // 確認メッセージ表示
        var ret = confirm( this.msg_destroy_confirm ) ;
        if( !ret ) return false ;
            
        try{
            Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'hidden' ;
            Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'hidden' ;
            Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'hidden' ;
            var url = this.destroyurl ;

			// 非同期リクエスト
			var options =
			{
				url: url,
				form: this.frmid,
				success: this.onDestroySuccess ,
				failure: this.onDestroyFail,
				scope: this,
				method :'POST'
			} ;
			Ext.Ajax.request(options) ;

        } catch(e) {
            alert(e.message);
        }
    
        return false ;
    },

    /*
     * 関数名：onDestroySuccess
     * 概　要：削除処理成功イベント。
     *         処理成功時の後処理を行う。
     * 引　数：obj      Object      サーバーレスポンスオブジェクト
     * 戻り値：なし
     */
    onDestroySuccess : function(obj){
        var responseobj = Ext.util.JSON.decode(obj.responseText) ;

        var success = responseobj.success ;
        var message = responseobj.message ;
        if( success ){
            this.responseobj = responseobj ;
            var resultobj = responseobj.result ;
            this.resulthtml = resultobj.resulthtml ;

            this.dialog.hide();
            // コールバック関数呼び出し
            this.fncExecCallback("on_destroy");
        }
        else{
            alert(message) ;
        }
    },
    
    /*
     * 関数名：onDestroyFail
     * 概　要：削除処理失敗イベント。
     *         処理失敗時の後処理を行う。
     * 引　数：obj      Object      サーバーレスポンスオブジェクト
     * 戻り値：なし
     */
    onDestroyFail : function(obj){
        alert(obj.responseText) ;
        Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'visible' ;
    },

    /*
     * 関数名：onBeforeShow
     * 概　要：ダイアログ表示前イベント
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    onBeforeShow : function( dlg ){
        this.fncDataLoad() 
    },
        
    /*
     * 関数名：onClose
     * 概　要：閉じるボタンクリックイベント
     *         ダイアログを閉じる。
     * 引　数：なし
     * 戻り値：なし
     */
    onClose : function(){
       this.dialog.hide() ;
       // コールバック関数呼び出し
        this.fncExecCallback("on_close");
    },
    
    /*
     * 関数名：onTaskUserSelect
     * 概　要：担当者ユーザー追加ボタンクリックイベント
     *         ユーザー選択ダイアログを表示する
     * 引　数：なし
     * 戻り値：なし
     */
    onTaskUserSelect : function(){

        // パラメータハッシュ生成
        var initparam = {};

        initparam["base_id"] = this.elmid_btn_tusel ;
        
        // データパラメータの設定
        initparam["dataparam"] = {};
        initparam["dataparam"]["select_single"] = true ;

        initparam["dataparam"]["initialdata"]= {};
        initparam["dataparam"]["initialdata"]["projectusers"] = this.projectusers ;

        // コールバックの設定
        initparam["on_select"] = [this.onTaskUserSelect_Selected.createDelegate(this)];
        initparam["on_close"] = [this.onTaskUserSelect_Closed.createDelegate(this)];

        Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'hidden' ;
        Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'hidden' ;
        Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'hidden' ;
        // 担当者ユーザー追加ダイアログ表示
        App.Page.thispage.dialogs.ProjectuserDlgSelect.fncShowDialog(initparam) ;
    },

    /*
     * 関数名：onTaskUserIns
     * 概　要：担当者ユーザー追加ボタンクリックイベント
     *         選択ユーザーを担当者リストへ移動する。
     * 引　数：なし
     * 戻り値：なし
     */
    onTaskUserSelect_Selected : function(){
        Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'visible' ;
        var length = App.Page.thispage.dialogs.ProjectuserDlgSelect.fncGetProjectUsersSize() ;
        var select_multi_ids = {};
        var select_single_id = null ;
        for( var index=0 ; index<length ; index++ ){
            var id = App.Page.thispage.dialogs.ProjectuserDlgSelect.fncGetProjectUserAttribute(index, "projectuser_id") ;
            select_multi_ids[id] = App.Page.thispage.dialogs.ProjectuserDlgSelect.fncGetProjectUserAttribute(index, "select_multi") ;
            if( App.Page.thispage.dialogs.ProjectuserDlgSelect.fncGetProjectUserAttribute(index, "select_single") ){
                select_single_id = id ;
            }
        }
        
        for( var index=0 ; index<this.projectusers.length ; index++ ){
            this.projectusers[index].select_multi = select_multi_ids[this.projectusers[index].projectuser_id] ;
            if( select_single_id == this.projectusers[index].projectuser_id ){
                this.projectusers[index].select_single = true ;
            }
            else{
                this.projectusers[index].select_single = false ;
            }
        }
        
        this.fncUpdateProjectUsers() ;
    },

    onTaskUserSelect_Closed : function(){
        Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'visible' ;
    },
    
    /*
     * 関数名：fncReset
     * 概　要：ダイアログ内容をリセットする
     * 引　数：なし
     * 戻り値：なし
     */
    fncReset: function()
    {
        if(!this.dataparam['id']){
            Ext.get(this.elmid_btn_destroy).dom.style.visibility = 'hidden' ;
        }
        else{
            Ext.get(this.elmid_btn_destroy).dom.style.visibility = 'visible' ;
        }
        var form = Ext.get(this.frmid);
        form.dom.reset() ;
				Ext.get('dlg_tsk_edit_base_id').dom.value = ""; //add
        Ext.getCmp('dlg_tsk_edit_task_client_user_id').setValue('');
        Ext.get('dlg_tsk_edit_taskusers_user_name').dom.innerHTML = "" ;
    },

    /*
     * 関数名：fncDataRead
     * 概　要：パラメータの内容で、データを読み込む
     * 引　数：なし
     * 戻り値：なし
     */
    fncDataLoad: function()
    {
        Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'hidden' ;
        Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'hidden' ;
        Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'hidden' ;


        try{
            Ext.get('dlg_tsk_edit_base_id').dom.value = this.dataparam['base_id'] ;
            Ext.get('dlg_tsk_edit_task_id').dom.value = "" ;
            Ext.get('dlg_tsk_edit_comp_id').dom.value = this.dataparam['id'] ;
            Ext.get('dlg_tsk_edit_comp_project_id').dom.value = this.dataparam['project_id'] ;
            Ext.get('dlg_tsk_edit_comp_class_word1').dom.value = this.dataparam['class_word1'] ;
            Ext.get('dlg_tsk_edit_comp_class_word2').dom.value = this.dataparam['class_word2'] ;
            Ext.get('dlg_tsk_edit_comp_class_word3').dom.value = this.dataparam['class_word3'] ;

            var url = "";
            if( Ext.get('dlg_tsk_edit_comp_id').dom.value == "" ){
              // 新規作成処理要求
              url = this.newurl ;
            }
            else{
              // 更新要求
              url = this.editurl ;
            }

			// 非同期リクエスト
			var options =
			{
				url: url,
				form: this.frmid,
				success: this.onDataLoadSuccess ,
				failure: this.onDataLoadFail,
				scope: this,
				method :'POST'
			} ;
			Ext.Ajax.request(options) ;

        } catch(e) {
            alert(e.message);
        }
    
        return false ;
    },

    /*
     * 関数名：onDataLoadSuccess
     * 概　要：保存処理成功イベント。
     *         処理成功時の後処理を行う。
     * 引　数：obj      Object      サーバーレスポンスオブジェクト
     * 戻り値：なし
     */
    onDataLoadSuccess : function(obj){
        var responseobj = Ext.util.JSON.decode(obj.responseText) ;
        this.responseobj = responseobj ;

        var success = responseobj.success ;
        var message = responseobj.message ;
        var elm ;
        if( success ){

            var resultobj = responseobj.result ;
            
            var task = resultobj.task ;
            var projectcomp = resultobj.projectcomp ;
            var projectusers = resultobj.projectusers ;
            var taskusers = resultobj.taskusers ;

            var taskuser_regist_id = {};

            // 設定済みのタスクユーザーのIDをキーに、ハッシュを生成
            if( taskusers != null ){
                for( var index=0 ; index<taskusers.length ; index++){
                    taskuser_regist_id[taskusers[index].projectuser_id] = true ;
                }
            }
            if( projectusers != null ){
                cmp = Ext.getCmp('dlg_tsk_edit_task_client_user_id') ;
				var users = [];
                for( var index=0 ; index<projectusers.length ; index++){
 					users.push( [ projectusers[index].projectuser_id, projectusers[index].user_name ] )
                }

		        cmp.clearValue() ;
		        cmp.store.loadData(users);

                for( var index=0 ; index<projectusers.length ; index++){
                    if( taskuser_regist_id[projectusers[index].projectuser_id] ){
                        projectusers[index].select_multi = true ;
                    }
                    else{
                        projectusers[index].select_multi = false ;
                    }
                    if( task.main_user_id == projectusers[index].projectuser_id ){
                        projectusers[index].select_single = true ;
                    }
                    else{
                        projectusers[index].select_single = false ;
                    }
                }
            }
            this.projectusers = projectusers ;
            this.fncUpdateProjectUsers() ;

            for ( var colname in task ){
                var id = 'dlg_tsk_edit_task_' + colname;
                if (Ext.getCmp(id)) {
                    Ext.getCmp(id).setValue(task[colname]);
                } else if (Ext.get(id)) {
                    Ext.get(id).dom.value = task[colname];
                }
            }
            for ( var colname in projectcomp ){
                var id = 'dlg_tsk_edit_comp_' + colname;
                var col = Ext.getCmp(id);
                if (Ext.getCmp(id)) {
                    col.setValue(projectcomp[colname]);
                } else if (Ext.get(id)) {
                    Ext.get(id).dom.value = projectcomp[colname];
                }
            }
            
            //優先度
            var cmp = Ext.getCmp("dlg_tsk_edit_task_priority_kbn");
            cmp.setValue(task.priority_kbn ? task.priority_kbn : '');
            //予測時間単位
            var cmp = Ext.getCmp("dlg_tsk_edit_task_tani_kbn");
            cmp.setValue(task.tani_kbn ? task.tani_kbn : '');
            //依頼者
            var cmp = Ext.getCmp("dlg_tsk_edit_task_client_user_id");
            cmp.setValue(task.client_user_id ? task.client_user_id : '');

            
         }
         else{
            alert(message) ;
         }
          Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'visible' ;
          Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'visible' ;
          Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'visible' ;
    },
    
    /*
     * 関数名：onDataLoadFail
     * 概　要：保存処理失敗イベント。
     *         処理失敗時の後処理を行う。
     * 引　数：obj      Object      サーバーレスポンスオブジェクト
     * 戻り値：なし
     */
    onDataLoadFail : function(obj){
        alert(obj.responseText) ;
        Ext.get('dlg_tsk_edit_task_priority_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_tani_kbn').dom.style.visibility = 'visible' ;
        Ext.get('dlg_tsk_edit_task_client_user_id').dom.style.visibility = 'visible' ;
    },

    /*
     * 関数名：fncInputCheck
     * 概　要：入力チェックを実施する。
     * 引　数：なし
     * 戻り値：boolean      (true:チェックOK、false:チェックNG)
     */
    fncInputCheck : function(){
//        var task_id = Ext.get('dlg_tsk_edit_task_id').dom.value ;
//		if (task_id == "") {
			// タスク名
	        var item_name = Ext.get('dlg_tsk_edit_comp_item_name').dom.value ;
			if (item_name == '') {
				alert('タスク名は必須入力です。');
				return false;
			}
//		}
		// 予測時間
        var plan_power = Ext.get('dlg_tsk_edit_task_plan_power').dom.value ;
		if (plan_power == '') {
			alert('予測時間は必須入力です。');
			return false;
		}
		if (isNaN(plan_power)) {
			alert('予測時間が正しくありません。');
			return false;
		}
		// 期限
        var complete_date = Ext.get('dlg_tsk_edit_task_complete_date').dom.value ;
		if (complete_date == '') {
			alert('期限は必須入力です。');
			return false;
		}
		// 日付書式チェック
		var complete_date_valid = this.fncValidDate(complete_date);
		if (!complete_date_valid) {
			alert('期限が正しくありません。');
			return false;
		}
		// 開始日
        var start_date = Ext.get('dlg_tsk_edit_task_start_date').dom.value ;
		if (start_date == '') {
			alert('開始日は必須入力です。');
			return false;
		}
		// 日付書式チェック
		var start_date_valid = this.fncValidDate(start_date);
		if (!start_date_valid) {
			alert('開始日が正しくありません。');
			return false;
		}
		// 終了日
        var end_date = Ext.get('dlg_tsk_edit_task_end_date').dom.value ;
		if (end_date == '') {
			alert('終了日は必須入力です。');
			return false;
		}
		// 日付書式チェック
		var end_date_valid = this.fncValidDate(end_date);
		if (!end_date_valid) {
			alert('終了日が正しくありません。');
			return false;
		}
		// 期間前後チェック
		var between_valid = this.fncBackToForth(start_date, end_date);
		if (!between_valid) {
			alert('期間が正しくありません。');
			return false;
		}
		// 期限前後チェック
		var between_valid = this.fncBackToForth(end_date, complete_date);
		if (!between_valid) {
			alert('終了日は期限より後に出来ません。');
			return false;
		}
		// 依頼者
        var client_user_id = Ext.get('dlg_tsk_edit_task_client_user_id').dom.value ;
		if (client_user_id == '') {
			alert('依頼者は必須入力です。');
			return false;
		}
		// 主担当者
		var main_user_id = '';
        for( var index=0 ; index<this.projectusers.length ; index++ ){
            var pu = this.projectusers[index] ;
            if( pu.select_multi ){
                if( pu.select_single ){
                    main_user_id = pu.user_id ;
                }
            }
        }
		if (main_user_id == '') {
			alert('主担当者は必須入力です。');
			return false;
		}
		// 成果物
        var result = Ext.get('dlg_tsk_edit_task_result').dom.value ;
		if (result == '') {
			alert('成果物は必須入力です。');
			return false;
		}

        return true ;
    },
    
    fncUpdateProjectUsers : function(){
        var taskusers_name = "" ;
        for( var index=0 ; index<this.projectusers.length ; index++ ){
            var pu = this.projectusers[index] ;
            if( pu.select_multi ){
                if( taskusers_name !="" ) taskusers_name += "，" ;
                if( pu.select_single ){
                    taskusers_name += '' + pu.user_name + '(' + app_localized_message("label", "main_user_abb") + ')' ;
                }
                else{
                    taskusers_name += pu.user_name ;
                }
            }
        }
        Ext.get('dlg_tsk_edit_taskusers_user_name').dom.innerHTML = taskusers_name ;
    },
    
    fncFormSetProjectUsers : function(){
        Ext.get('dlg_tsk_edit_hidden_area').dom.innerHTML = "" ;
        for( var index=0 ; index<this.projectusers.length ; index++ ){
            var pu = this.projectusers[index] ;
            if( pu.select_multi ){
                var html = '<input type="hidden" name="dlg_tsk_edit_taskusers[projectuser_id][]" value="'+pu.projectuser_id+'">';
                var obj = Ext.get('dlg_tsk_edit_hidden_area');
                obj.insertHtml('beforeEnd', html);
                if( pu.select_single ){
                    var html = '<input type="hidden" name="dlg_tsk_edit_task[main_user_id]" value="'+pu.projectuser_id+'">';
                    var obj = Ext.get('dlg_tsk_edit_hidden_area');
                    obj.insertHtml('beforeEnd', html);
                }
            }
        }
    },
    
    onCompleteDateChanged : function(){
        var comp_date_elm = Ext.get('dlg_tsk_edit_task_complete_date') ;
        var start_date_elm = Ext.get('dlg_tsk_edit_task_start_date') ;
        var end_date_elm = Ext.get('dlg_tsk_edit_task_end_date') ;
        
        var comp_value = comp_date_elm.dom.value ;
        if( comp_value == "" ) return false ;
        if( start_date_elm.dom.value != "") return false ;
        if( end_date_elm.dom.value != "") return false ;
        
        var comp_dt    = Date.parseDate(comp_value, "Y-m-d") ;
        if( comp_dt == null ) return false ;
        
        start_date_elm.dom.value = comp_dt.format('Y-m-d') ;
        end_date_elm.dom.value = comp_dt.format('Y-m-d') ;
    }

});
//=============================
// 現在のページオブジェクトのdialogsメンバーに設定
//=============================
App.Page.thispage.dialogs.TaskDlgIndex = new App.TaskDlgIndex() ;